package tablaSimbolos;

import java.util.HashMap;
import java.util.Map;

import utils.Clase;
import utils.Info;

class TablaSimbolos {
	/**
	 * Nivel [0, 1, 2, 3, 4, 5, 6, 7] Map [ID | <clase, dir, info>]
	 */

	private Map<String, Tupla> ts;

	public TablaSimbolos() {
		ts = new HashMap<String, Tupla>();
	}

	public Map<String, Tupla> getTS() {
		return ts;
	}

	public void setTS(Map<String, Tupla> ts) {
		this.ts = ts;
	}

	public void addSymbol(String iden, Clase clase, Info info, Integer dir) {
		ts.put(iden, new Tupla(clase, dir, info));
	}

	public Clase getClase(String id) {
		if (ts.containsKey(id)) {
			return ts.get(id).getClase();
		} else {
			return null;
		}
	}

	public void setClase(String id, Clase clase) {
		ts.get(id).setClase(clase);
	}

	public Info getInfo(String id) {
		if (ts.containsKey(id)) {
			return ts.get(id).getInfo();
		} else {
			return null;
		}
	}

	public void setInfo(String id, Info info) {
		ts.get(id).setInfo(info);
	}

	public Integer getDir(String id) {
		if (ts.containsKey(id)) {
			return ts.get(id).getDir();
		} else {
			return null;
		}
	}

	public void setDir(String id, Integer dir) {
		ts.get(id).setDir(dir);
	}

	public Tupla get(String id) {
		return ts.get(id);
	}
	
	public boolean containsKey(Object o) {
		if (o == null || !(o instanceof String)) {
			return false;
		} else {
			return ts.containsKey((String) o);
		}
	}

	public String toString() {
		return ts.toString();
	}
	
	private class Tupla {

		private Clase clase;
		private Integer dir;
		private Info info;

		private Tupla(Clase clase, Integer dir, Info info) {
			this.clase = clase;
			this.dir = dir;
			this.info = info;
		}

		private Clase getClase() {
			return clase;
		}

		private void setClase(Clase clase) {
			this.clase = clase;
		}

		private Integer getDir() {
			return dir;
		}

		private void setDir(Integer dir) {
			this.dir = dir;
		}

		private Info getInfo() {
			return info;
		}

		private void setInfo(Info info) {
			this.info = info;
		}

		public String toString() {
			return "<clase: " + clase + ", dir: " + dir + ", tipo: " + info + ">";
		}
	}

}
